home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / t3_1 / doc.lha / documentation / manual / program.mss < prev    next >
Text File  |  1987-06-30  |  15KB  |  357 lines

  1. @part[Program, root "TMAN.MSS"] @Comment{-*-System:TMAN-*-}
  2. @chap[Program structure]
  3. @label[Program chapter]
  4.  
  5.  
  6. This chapter provides information about organizing, loading, and
  7. compiling programs.
  8.  
  9.  
  10. @section[Environment structure]
  11.  
  12. Lexical environments in @Tau[] are hierarchically arranged.  Variable
  13. bindings are inherited from outer (superior) contours to inner
  14. (inferior) ones.  At the top of the hierarchy is a
  15. root environment, which has no bindings in it.  Inferior to that is a
  16. standard environment which has bindings for all standard system
  17. variables, for example, @tc[CAR] and @tc[+].  (See section @ref[standard
  18. environment section].)
  19. Inferior to the standard environment are environments into which programs
  20. have been or are to be loaded.  In the standard environment, the variable
  21. @tc[*STANDARD-ENV*] is bound to the standard environment itself.
  22.  
  23. When a @Tau[] system starts up, it sets up an initial environment
  24. configuration which has one environment inferior to the standard
  25. environment, called the @iix[scratch environment].  The variable
  26. @tc[*SCRATCH-ENV*] is bound in the standard
  27. environment to the scratch environment.  The scratch environment has
  28. no variable bindings in it at first; however, the initial
  29. read-eval-print loop (section @ref[REPL section]) is started in this
  30. environment, so that if no other provision is made, user global variable
  31. (i.e. definitions) will be made in the scratch environment.
  32.  
  33. In @Timp[] 2.7, there is another environment called the
  34. @iix[implementation environment] (page @pageref[*T-IMPLEMENTATION-ENV*]).
  35. This is the value of @tc[*T-IMPLEMENTATION-ENV*] in the standard
  36. environment.  The implementation environment is not inferior to the
  37. standard environment, but instead is inferior to the root.
  38.  
  39.   @begin[ProgramExample]
  40.                             ------ root environment (empty) ----------
  41.                            /                            |             \
  42.             ------- *STANDARD-ENV* ------     *T-IMPLEMENTATION-ENV*   ...
  43.            /      |        |      ...    \
  44. *SCRATCH-ENV*  *TC-ENV*  *EWE-ENV*   other environments
  45.                                     /      ...         \
  46.                                    ...                 ...
  47.   @end[ProgramExample]
  48.  
  49. Empty environments may be created using @tc[MAKE-EMPTY-LOCALE] (page
  50. @pageref[MAKE-EMPTY-LOCALE]).  For example:
  51.   @begin[ProgramExample]
  52. (DEFINE *ALMOST-USELESS-ENV* (MAKE-EMPTY-LOCALE '*ALMOST-USELESS-ENV*))
  53. (*DEFINE *ALMOST-USELESS-ENV* '+ +)
  54. (*DEFINE *ALMOST-USELESS-ENV* '- -)
  55. (EVAL '(+ 5 (- 21 13)) *ALMOST-USELESS-ENV*)  @ev[]  13
  56.   @end[ProgramExample]
  57.  
  58. @desc[*STANDARD-ENV* @yl[] @i[locale]]
  59. The value of @tc[*STANDARD-ENV*] is an environment (a locale)
  60. in which all system variables have appropriate values,
  61. as described in this manual.  That is, it is a @i[standard environment]
  62. in the sense of section @ref[StandardEnvironmentSection].
  63. @index[Standard environment]
  64. @EndDesc[*STANDARD-ENV*]
  65.  
  66. @label[user-env]@Comment{(REPL-ENV)}
  67. @desc[*SCRATCH-ENV* @yl[] @i[locale]]
  68. The value of @tc[*SCRATCH-ENV*] is an environment (a locale)
  69. inferior to @tc[*STANDARD-ENV*].
  70. It is provided by a @Tau[] implementation as an environment in which a user
  71. may evaluate expressions and write programs.
  72. Other evaluation environments may be created inferior
  73. to @tc[*STANDARD-ENV*], however, with @tc[MAKE-LOCALE] (page
  74. @pageref[MAKE-LOCALE]).
  75. @EndDesc[*SCRATCH-ENV*]
  76.  
  77.  
  78. @section[Source files]
  79.  
  80. @Tau[] programs are usually represented by collections of one or more text
  81. files resident in a file system.  Text files containing @Tau[] programs
  82. are called @iix[source files].
  83.  
  84. A source file consists of a sequence of (external representations of)
  85. @Tau[] expressions.  Source files may be @i[loaded] into a @Tau[] environment.
  86. When a file is loaded, the expressions in the file are evaluated.
  87. Typically, this means that useful side-effects, such as procedure
  88. definitions, occur which then make the program available in that @Tau[]
  89. environment.
  90. @index[loading]
  91.  
  92. A compilation (semantic analysis) step must occur either as a file
  93. is being loaded, or prior to loading the file.  In the former case,
  94. compilation is typically performed by a compiler such as the
  95. @qu"standard compiler" (page @pageref[STANDARD-COMPILER]) which itself runs
  96. relatively quickly and produces intermediate code which must then
  97. be interpreted.  In the latter case, an auxiliary file known as an
  98. @i[object file] is involved; the compilation step need only be performed
  99. once, even if the file is to be loaded many times.  (The term @i[object
  100. file] is completely unrelated to the term @i[object.])
  101.  
  102. A @i[file compiler] (such as TC; see section @ref[TC section]) takes
  103. a source file as input and produces an object file as output.  The
  104. object file may then be loaded in lieu of the source file, with
  105. the same effect.
  106.  
  107. @BeginInset[Note:]
  108. In the current implementation, the standard compiler cannot be used
  109. as a file compiler, and TC cannot be used as an @qu"on-the-fly"
  110. compiler.  In principle, the two dimensions of compiler and compilation
  111. mode are orthogonal:  it should be possible to use either compiler
  112. in either manner.  In practice, this is not the case, but it turns out
  113. not to be too much of a problem.
  114. @EndInset[]
  115.  
  116.  
  117. @section[File syntax]
  118.  
  119. The first form in a source file must be a list whose car is the
  120. symbol @tc[HERALD].  This form is not an expression, but
  121. rather is part of the syntax of the file.
  122. It provides information relevant to programs which operate on the
  123. source file (such as readers, compilers, and loaders).
  124. The syntax of a @tc[HERALD]-form is as follows:
  125.   @begin[ProgramExample]
  126. (HERALD @i[identification] . @i[items])
  127.   @end[ProgramExample]
  128. @i[Identification] should be either @tc[()] or a symbol identifying
  129. the file (usually the same as the root of the name of the file).
  130. It is for documentary purposes only.
  131.  
  132. @i[Items] is a sequence of lists.  Each @i[item] should be
  133. a list beginning with a valid keyword symbol, as described below.
  134.  
  135. Example:
  136.   @begin[ProgramExample]
  137. (HERALD FACT
  138.         (READ-TABLE *MATH-READ-TABLE*)
  139.         (ENV T (MATH MATHMACROS)))
  140.   @end[ProgramExample]
  141.  
  142. @info[NOTES="Herald item"]
  143. @desc[(READ-TABLE @i[expression])]
  144. @i[Expression] should evaluate to a read table, which is used
  145. in reading the expressions which follow the @tc[HERALD]-form from
  146. the source file.  The environment in which @i[expression] is evaluated
  147. depends on the program processing the file (but might be, e.g., the
  148. scratch environment).
  149.  
  150. If this item is absent, then expressions are read using the
  151. standard read table.
  152. @enddesc[READ-TABLE]
  153.  
  154. @info[NOTES="Herald item"]
  155. @desc[(SYNTAX-TABLE @i[expression])]
  156. @i[Expression] should evaluate to a syntax table, which is used
  157. in compiling (evaluating) the expressions in the source file.
  158. The environment in which @i[expression] is evaluated
  159. depends on the program processing the file (but might be, e.g., the
  160. scratch environment).
  161.  
  162. If this item is absent, then expressions are compiled according
  163. to an appropriate syntax table: the syntax table associated with the
  164. locale into which the file is being loaded, if the file is being loaded,
  165. or the current value of @tc[(TC-SYNTAX-TABLE)] (see below), if the
  166. file is being compiled using TC.
  167.     @BeginInset[Bug:]
  168.     In @Timp[] 2.7, this works in TC, but is ignored in the
  169.     standard compiler (that is, when loading a source file directly).
  170.     @tc[LOAD] will always use the syntax table of the environment into
  171.     which the file is being loaded.
  172.     @EndInset[]
  173. @enddesc[SYNTAX-TABLE]
  174.  
  175. @dc{
  176. @info[NOTES="Herald item"]
  177. @desc[(SUPPORT @i[expression])]
  178. @i[Expression] should evaluate to a support environment, which is
  179. used to compile the file.
  180. @enddesc[SUPPORT]
  181. }
  182.  
  183. @info[NOTES="Herald item"]
  184. @desc[(ENV @i[support-env-name] . @i[filespecs])]
  185. Specifies a support (early binding) environment for compiling the file.
  186. The support environment consists of the support environment named
  187. by @i[support-env-name], augmented by information obtained from
  188. support files named by @i[filespecs].
  189.  
  190. If this item is absent, then the standard support environment,
  191. whose name is @tc[T], is used.  The ability to create and name other
  192. support environments is not yet documented.
  193. @enddesc[ENV]
  194.  
  195.  
  196. @section[Loading files]
  197.  
  198. @dc{
  199.  
  200.     REQUIRE
  201.     INCLUDE
  202.     FILE-LOADED?
  203.  
  204. }
  205.  
  206.  
  207. @desc[(LOAD @i[filespec] @i[environment]) @yl[] @i[undefined]]
  208. Loads the file named by @i[filespec].  If the file is a source file,
  209. then each expression in the file is compiled (with the standard
  210. compiler) and run in @i[environment].  If the file is an object file,
  211. as produced by TC, then the compiled object code is simply run in
  212. @i[environment].
  213.  
  214. If no explicit file type is given in the @i[filespec], then @tc[LOAD]
  215. will load either an object file (file type @tc[BIN]), if one exists,
  216. or a source file (file type @tc[T]) otherwise.
  217. @EndDesc[LOAD]
  218.  
  219. @dc{
  220. @desc[(*REQUIRE @i[file-id] @i[filespec] @i[environment]) @yl[] @i[undefined]]
  221. Ensures that the file specified by @i[filespec] has been
  222. loaded into @i[environment].  More precisely, it loads the specified file
  223. unless a file whose file identifier (as given in its @tc[HERALD] form)
  224. is @i[file-id] has already been loaded into @i[environment].
  225. @enddesc[*REQUIRE]
  226.  
  227. @info[Notes="Special form"]
  228. @desc[(REQUIRE @i[file-id] @i[filespec]) @yl[] @i[undefined]]
  229. Like @tc[*REQUIRE], but operates with the current lexical environment.
  230. E.g. if the current lexical environment is @tc[*MATH-ENV*],
  231. then
  232.   @begin[ProgramExample]
  233. (REQUIRE FACT (MATH FACT))  @ce[]  (*REQUIRE 'FACT '(MATH FACT) *MATH-ENV*)
  234.   @end[ProgramExample]
  235. @enddesc[REQUIRE]
  236. }
  237.  
  238. @dc{
  239. @desc[(OBJECT-FILE? @i[filespec]) @yl[] @i[boolean]]
  240. Returns true if the specified file is an object file.
  241. @index[Object files]
  242. (Object files are the result of assembling the output of
  243. TC; see page @pageref[COMFILE].)
  244. @EndDesc[OBJECT-FILE?]
  245.  
  246. @desc[(OBJECT-FILE-STREAM? @i[input-stream]) @yl[] @i[boolean]]
  247. Returns true if @i[stream] is a stream open on an object file.
  248. This is only defined to work if no input has yet been read from @i[stream].
  249. @EndDesc[OBJECT-FILE-STREAM?]
  250. }
  251.  
  252.  
  253. @section[File compilation]
  254. @label[TC section]
  255.  
  256. In addition to the standard compiler invoked when @tc[EVAL] or
  257. @tc[LOAD] is called,
  258. @Timp[] provides a so-called optimizing compiler.  This compiler,
  259. known as TC (for @qu"@Tau[] compiler"), trades compilation
  260. speed for execution speed: @tc[STANDARD-COMPILER] tries to compile quickly,
  261. while TC tries to generate executable code which will run
  262. fast.@index[Compilers]@index[Early binding]
  263.  
  264. To help produce more efficient code, TC makes assumptions about the
  265. values that some variables will have at run-time.  These assumptions
  266. are called @iix[early bindings.]  For example, it will ordinarily assume
  267. that the variable @tc[PAIR?] will have the standard @tc[PAIR?] predicate
  268. as its top-level value.  This means that if an object file produced
  269. under this assumption is loaded into a lexical environment where this
  270. is not the case, then calls to @tc[PAIR?] will not execute the same as
  271. they would if the source file had been loaded.
  272.  
  273. Early bindings are obtained from @iix[support environments].
  274. The support environment to be used in compiling a file may be
  275. specified by an @tc[ENV] clause in the file's
  276. header.  (See page @pageref[ENV].)
  277. A support environment may contain user-defined integrable procedure
  278. and constant definitions.
  279.  
  280. Besides early binding, another source of improved efficiency is a
  281. difference in the handling of undefined effects (that is, run-time
  282. program errors).
  283. @index[undefined effects]
  284. When code compiled using the standard compiler incurs an error, an
  285. error is signalled, and the error system is entered, giving the user
  286. an opportunity to debug the problem at the point where it occurs.
  287. Code compiled using TC has less error-checking, so the effect of an
  288. error may go unnoticed until long after the error occurred, or a
  289. secondary error of an obscure or unexpected kind will occur.
  290.  
  291. Instead of being a part of the normal @Timp[] run-time system, the optimizing
  292. compiler is invoked as a separate program with an appropriate
  293. system command
  294. (probably @qu"@t[tc]").  When TC starts up it is in a
  295. read-eval-print loop and looks very much like @timp[].
  296. In fact, TC is simply a version of @Timp[] with the following additional
  297. definitions available in @tc[*STANDARD-ENV*].
  298.  
  299. @desc[(COMFILE @i[filespec]) @yl[] @i[undefined]]
  300.  
  301. Compiles a file.  For example, to compile file @tc[fact.t], say
  302. @wt[(COMFILE "fact")].  TC writes three output files, all having the
  303. same file name as the
  304. @tau[] source, and distinguished by extension:
  305.  
  306. @begin[Itemize]
  307. The @iixs[noise file] is a transcript of what TC wrote to the terminal
  308. in the course of the compilation.  TC also writes some additional
  309. statistics and cross-referencing information to noise files.
  310.  
  311. The @iixs[support file] contains early binding information useful
  312. for compiling other files with TC.  See the @tc[ENV] file header
  313. clause, page @pageref[ENV].
  314.  
  315. The @iixs[assembly file] should be assembled on the target machine to
  316. get an @iixs[object file] that can be loaded into @timp[].
  317. @end[itemize]
  318.  
  319. The file extensions for the output files depend on the target system.
  320. For MC68000/Aegis, VAX/Unix, and VAX/VMS, the extensions are as follows:
  321. @begin[display]
  322. @TabDivide[6]
  323. System @\Architecture @\Support   @\Noise     @\Assembly  @\Object
  324. Aegis  @\68000        @\@tc[.ams] @\@tc[.amn] @\@tc[.asm] @\@tc[.bin]
  325. Unix   @\VAX11        @\@tc[.uvs] @\@tc[.uvn] @\@tc[.s]   @\@tc[.o]
  326. VMS    @\VAX11        @\@tc[.vvs] @\@tc[.vvn] @\@tc[.mar] @\@tc[.bin]
  327. @TabClear
  328. @end[display]
  329. @EndDesc[COMFILE]
  330.  
  331. @info[NOTES="Settable"]
  332. @desc[(TC-SYNTAX-TABLE) @yl[] @i[syntax-table]]
  333. This is the basic syntax table from which TC
  334. obtains macro definitions.  TC obtains additional macro
  335. definitions from the support environment set up by an @tc[(ENV ...)]
  336. @tc[HERALD] clause.  Its default value is the syntax table of the
  337. scratch environment.
  338. @EndDesc[TC-SYNTAX-TABLE]
  339.  
  340. @info[NOTES="Settable"]
  341. @desc[(TC-MACRO-DEFINITION-ENV) @yl[] @i[environment]]
  342. The environment in which macro
  343. definition bodies themselves are evaluated, either as a result of
  344. encountering a @tc[DEFINE-LOCAL-SYNTAX] or @tc[LET-SYNTAX]
  345. expression, or by loading macro definitions from a
  346. support file.  Its default value is the scratch environment.
  347. @enddesc[TC-MACRO-DEFINITION-ENV]
  348.  
  349. @dc{ Should talk about what the compiler does; model of compiler as file
  350. transducer, procedure integration and optimization, and all the rest.
  351. Implementation of closures; when things are consed, how big they are.
  352. @tc[HERALD], environments, and support files.  Problems with readmacros
  353. and routines used by macro definitions.  Future work. }
  354.  
  355. @dc{ Need to talk about debugging compiled code - nonvalues and all that.
  356. "Reference to non-existent memory." }
  357.